# 创建时间：2024/7/9下午1:21
def hex_dump(data, step=16, upper=False):
    """
    十六进制转储，把输入的数据以16进制格式打印

    :param data: 要进行十六进制转储的数据
    :param step: 步长，每行的字节数，默认16
    :param upper: 十六进制字母大写，默认小写
    """
    # 表头内容
    # 空出行号位置
    output = ['\t\t ']
    # 列序号
    output.extend(['%02X ' % i for i in range(step)] if upper else ['%02x ' % i for i in range(step)])
    # 换行，表头结束
    output.append('\n')
    # 遍历数据内容
    for i in range(0, len(data), step):
        # 保存当前行字节串
        sub = data[i:i + step]
        # 8位16进制行号
        output.append('%08X ' % i if upper else '%08x ' % i)
        # 当前行字节内容转16进制，2位16进制1组
        output.extend(['%02X ' % j for j in sub] if upper else ['%02x ' % j for j in sub])
        # 最后一行用空格补齐
        output.append('   ' * (step - len(sub)))
        # 解码后的内容
        output.append(''.join([chr(i) if 0x20 <= i < 0x7f else '.' for i in sub]))
        # 换行，当前行结束
        output.append('\n')
    # 打印所有内容
    print(''.join(output))
